const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const bodyParser = require('body-parser');
const morgan = require('morgan');
require('dotenv').config();

const { testConnection } = require('./config/database');
const { apiLimiter } = require('./middleware/auth');
const userRoutes = require('./routes/users');

const app = express();
const PORT = process.env.PORT || 8080;

// 安全中间件
app.use(helmet());

// CORS配置
app.use(cors({
    origin: ['http://localhost:8080/api'], // 生产环境中设置具体域名
    credentials: true,
    methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
    allowedHeaders: ['Content-Type', 'Authorization', 'x-encryption-key']
}));

// 日志中间件
app.use(morgan('combined'));

// 解析请求体
app.use(bodyParser.json({ limit: '10mb' }));
app.use(bodyParser.urlencoded({ extended: true, limit: '10mb' }));

// 速率限制
app.use('/api/', apiLimiter);

// 信任代理（用于获取真实IP）
app.set('trust proxy', 1);

// 健康检查
app.get('/health', (req, res) => {
    res.json({
        success: true,
        message: '服务运行正常',
        timestamp: new Date().toISOString()
    });
});

// API路由
app.use('/api/users', userRoutes);

// 404处理
app.use('*', (req, res) => {
    res.status(404).json({
        success: false,
        message: 'API端点不存在'
    });
});

// 全局错误处理
app.use((error, req, res, next) => {
    console.error('全局错误:', error);
    res.status(500).json({
        success: false,
        message: '服务器内部错误'
    });
});

// 启动服务器
async function startServer() {
    try {
        // 测试数据库连接
        await testConnection();

        app.listen(PORT, () => {
            console.log(`🚀 服务器运行在端口 ${PORT}`);
            console.log(`📱 API地址: http://localhost:${PORT}/api`);
            console.log(`🔍 健康检查: http://localhost:${PORT}/health`);
        });
    } catch (error) {
        console.error('启动服务器失败:', error);
        process.exit(1);
    }
}

startServer();

// 优雅关闭
process.on('SIGTERM', () => {
    console.log('收到SIGTERM信号，正在关闭服务器...');
    process.exit(0);
});

process.on('SIGINT', () => {
    console.log('收到SIGINT信号，正在关闭服务器...');
    process.exit(0);
});